// TODO 好奇怪啊，有些项目不需要#[macro_use]有些需要，而且这里还必须同时有这两个#[macro_use]
#[macro_use]
extern crate validator_derive;
extern crate validator;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;

mod constant;
mod model;

// TODO 尽管这里没有用到Validate（但是间接用到了它内部的方法），但是这也也必须加这个代码。。
use validator::{Validate};
//use validator_derive::Validate;
use model::req::{UserInfoReq};

fn main() {
    let data: UserInfoReq;
    // TODO 经过测试，unsafe不能跳过非pub字段的赋值，那么serde是怎么实现不是pub属性也能赋值的呢？
    data = UserInfoReq { mail: "1010993610@qq.com".to_owned(), phone: "13136161100".to_owned()
        , site: "https://www.baidu.中国".to_owned(), age: 20 };
    let result: Result<_, _> = data.validate();
    //result.is_ok()
    let _b = match result {
        // u是单元类型
        Ok(u) => println!("Ok是{:?}", u),
        // e的值可以是：ValidationErrors({"age": Field([ValidationError { code: "range", message: None
        // , params: {"max": Number(20.0), "min": Number(18.0), "value": Number(21)} }])})
        // 这个是mail和age都出错时：ValidationErrors({"mail": Field([ValidationError { code: "email", message: None
        // , params: {"value": String("1010993610qq.com")} }])
        // , "age": Field([ValidationError { code: "range", message: None
        // , params: {"min": Number(18.0), "value": Number(21), "max": Number(20.0)} }])})
        Err(e) => println!("是Err, {:?}", e),
    };
    println!("Hello, world!");
}
